番外篇:STM32之GPIO口速率配置究竟代表什么

您所在的位置:网站首页 slow slowly是什么意思 番外篇:STM32之GPIO口速率配置究竟代表什么

番外篇:STM32之GPIO口速率配置究竟代表什么

2023-09-02 23:26| 来源: 网络整理| 查看: 265

番外篇:STM32之GPIO口速率配置究竟代表什么

用过STM32的童鞋们都知道,STM32在GPIO配置时都需要选择一个GPIO速率,对于STM32F103系列芯片来说最快的配置应该是50Mhz左右(没记错的话)。那么这个50Mhz究竟代表了什么,我们今天详细探讨。 顺便的话就是测试一些常用硬件接口(硬件SPI为例)与软件模拟(软件SPI为例)的性能差别。(之前有老师说硬件spi和软件spi速度没什么区别,在此实践论证一下)。

先论证的芯片是STM32F103C8T6 首先是GPIO口配置,这里直接测试GPIOA的PA1:

static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pins : PA0 PA1 PA2 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL;//无上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//GPIO高速 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }

上述配置是用STM32CUBEMX配置的,只能配置GPIO速率为GPIO_SPEED_FREQ_HIGH,其实应该就是和库函数配置的50Mhz差不多。

GPIO配置完成开始测试,先使用HAL库的GPIO操作代码:

while (1) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); }

毫无疑问,这里会产生一个方波,这个方波的频率就是使用HAL库操作时GPIO的最大速率。但结果强差人意: 在这里插入图片描述 图里可以清晰看到,使用HAL库操作GPIO也就1.6M左右的速率,和50M相差甚远。查阅一番资料后发现HAL库为了可读性增加了大量冗余,因此HAL代码运行效率不如直接操作寄存器,直接操作寄存器或使用汇编语言会增加运行效率。 下面搞起寄存器: 修改主函数代码如下:

while (1) { GPIOA->ODR=1 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin : PA1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }

这里速率是GPIO_SPEED_FREQ_VERY_HIGH,是所能配置的最快的了,应该50Mhz快不少,具体是多少没了解过,知道的可以评论区告诉我。 先试试HAL库操作:

while (1) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); }

下面放实际的IO口波形图: 在这里插入图片描述 大概2.39MHZ,比F103快了几乎一倍不到,但就这???毕竟主频快了6倍左右,APB时钟也快了近3倍,结果IO速率就快一倍也有点强差人意,不知道是不是有什么错误如果大家发现可以指正。

下面测试STM32H743直接寄存器操作IO口,代码依旧简单:

while (1) { GPIOA->ODR=1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3